/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package caintra.Sapra.Pantalla.Prefactura;
 
import caintra.Sapra.Model.Calendariofacturacionpracticantes;
import caintra.Sapra.Model.Empresa;
import caintra.Sapra.Model.MovimientosCaintra;
import caintra.Sapra.Reportes.Prefactura.iniciarReporte;
import caintra.Sapra.Model.Practicante;
import caintra.Sapra.Model.PrefacturaCaintra;
import caintra.Sapra.Model.PrefacturaDetalle;
import caintra.Sapra.Model.Usuario;
import caintra.Sapra.Pantalla.Abono.AbonoQuery;
import caintra.Sapra.Pantalla.Abono.AbonoView;
import caintra.Sapra.Pantalla.Ajuste.DecisionPane;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import nextapp.echo2.app.Table;
import nextapp.echo2.app.event.ActionEvent;
import nextapp.echo2.app.event.ActionListener;
import nextapp.echo2.app.table.DefaultTableModel;
import nextapp.echo2.app.table.TableModel;
import java.util.HashMap;
import org.sapra.abc.dPracticante;
import org.sapra.dao.BanorteCuentas;
import org.sapra.dao.EMailMO;






/**
 *
 * @author Administrador
 */
public class PrefacturaMController implements ActionListener{
    public PrefacturaMView vista;
    public PrefacturaMQuery query;
    public List<Calendariofacturacionpracticantes> lista_periodo;
    public Calendariofacturacionpracticantes fecha,fecha_siguiente;
    public List<Practicante> Lista_Mayor;
    public List<MovimientosCaintra> lista_mov;

    public ArrayList<Practicante> Lista_Pantalla,Lista_Detalle;
    public Empresa empresa;
    public Table tabla;
    public TableModel tm;
    public HashMap Lista_Pract_Hm;
    public int seleccion_practicante=-1;
    public int long_cuenta=0;
    public Practicante p_sel;
    SimpleDateFormat formato=new SimpleDateFormat("yyyy-MM-dd");
    public Usuario usuario;
    public boolean autorizada;
    public PrefacturaCaintra factura;
    public List<PrefacturaDetalle> factura_Detalle;
    public EMailMO email;
    //AbonoView ab;
    //AbonoController ac;

    public int iva=16;
    public int comision = 1;
    public double _abono;
    public double _adeudo;


    final int Autorizada=1;
    final int No_Autorizada=2;
    final int Sin_Practicantes=3;
    final int Administrador=1;
    final int No_Administrador=2;


    public int tipo_proceso=0;
    public int tipo_usuario=0;

    public void error(String msj){
            //this.vista.removeAll();
            this.vista.window_error.setVisible(true);
            this.vista.add(this.vista.window_error);
            this.vista.window_error.mensaje_Panel(msj);
            

    }
    public void error2(){
            this.vista.window_error.setVisible(true);
            this.vista.add(this.vista.window_error);
    }
    public PrefacturaMController(PrefacturaMView vista) {
        try {
            this.vista=vista;
            email=new EMailMO();
            query=new PrefacturaMQuery();
            init();
        } catch (Exception e) {
            error("lb_error_cargapagina");
        }
    }

    public  void init(){
        try {
            this.vista.prac_tab.addActionListener(this);
            this.vista.sel_periodos.addActionListener(this);
            this.vista.ver_reporte.addActionListener(this);
            this.vista.autorizar.addActionListener(this);
            this.vista.cancelar.addActionListener(this);
            this.vista.actualizar.addActionListener(this);
            this.vista.movimientos.addActionListener(this);
            this.vista.ok_cuenta.addActionListener(this);
            this.vista.abono_adeudo.addActionListener(this);
            this.vista.b_seguro.addActionListener(this);
            this.vista.window_abono.setVisible(false);
            this.vista.window_decision.setVisible(false);
            this.vista.window_detail.setVisible(false);
            this.vista.window_error.setVisible(false);


            usuario=query.getUsuario(this.vista.usuarioId);  // obtiene el objeto del usuario que accesa  por su id

            if(usuario == null){ // si el usuario es null manda a error
                    error("prefactura_sin_usuario");
                    return;
            }
            empresa = query.getEmpresas(this.vista.empresaId);  //se obtiene la empresa por su id

            if(empresa == null){ //si la empresa es null manda a error
                    error("prefactura_sin_empresa");
                    return;
            }
            if(usuario.getTipoUsuario().equals("A") || usuario.getTipoUsuario().equals("E") || usuario.getTipoUsuario().equals("G") || usuario.getTipoUsuario().equals("C") ){
                if(usuario.getTipoUsuario().equals("A")){
                       tipo_usuario=1;
                }else{
                       tipo_usuario=2;
                }
            }else{
                error("Tipo de Usuario No Valido");
            }
            Action_selectEmpresa();//envia por primera y unica vez para obtener el periodo en curso
        } catch (Exception e) {
            error("lb_error_cargapagina");
        }
    }
    public void permisos(){
        try {
            this.vista.window_decision.setVisible(false);

            if(Autorizada == tipo_proceso){//si la prefactura esta autorizada
                
                if(tipo_usuario == Administrador){
                     this.vista.cancelar.setVisible(true);
                }else{
                    this.vista.cancelar.setVisible(false);
                }
                 this.vista.b_seguro.setVisible(false);
                 this.vista.movimientos.setVisible(false);
                 this.vista.lb_usuario.setVisible(true);
                 this.vista.ok_cuenta.setVisible(false);
                 this.vista.txt_cuenta.setVisible(false);
                 this.vista.autorizar.setVisible(false);
                 this.vista.lb_cuenta.setVisible(false);
                 this.vista.abono_adeudo.setVisible(false);

            }
            if(No_Autorizada == tipo_proceso){//si la prefactura esta autorizada
                this.vista.autorizar.setVisible(true);             
                this.vista.movimientos.setVisible(true);
                this.vista.lb_usuario.setVisible(false);
                if(tipo_usuario == Administrador){
                    this.vista.b_seguro.setVisible(false);
                    this.vista.lb_cuenta.setVisible(true);
                    this.vista.ok_cuenta.setVisible(true);
                    this.vista.txt_cuenta.setVisible(true);
                    this.vista.cancelar.setVisible(false);
                    this.vista.abono_adeudo.setVisible(true);
                }else{
                     this.vista.b_seguro.setVisible(false);
                     this.vista.lb_cuenta.setVisible(false);
                     this.vista.ok_cuenta.setVisible(false);
                     this.vista.txt_cuenta.setVisible(false);
                     this.vista.cancelar.setVisible(false);
                     this.vista.abono_adeudo.setVisible(false);
                }

            }
            if(Sin_Practicantes == tipo_proceso){
                this.vista.b_seguro.setVisible(false);
                this.vista.movimientos.setVisible(false);
                this.vista.abono_adeudo.setVisible(false);
                this.vista.ok_cuenta.setVisible(false);
                this.vista.autorizar.setVisible(false);
                this.vista.cancelar.setVisible(false);
                this.vista.ver_reporte.setVisible(false);
                this.vista.txt_cuenta.setVisible(false);
                this.vista.prac_tab.setVisible(false);
                this.vista.total_table.setVisible(false);

                this.vista.lb_vista_reporte.setVisible(false);
                this.vista.lb_usuario.setVisible(false);
                this.vista.lb_cuenta.setVisible(false);
                this.vista.sel_vista_reporte.setVisible(false);
                this.vista.lb_estatus.setVisible(false);

                return;


            }
            
            
            this.vista.lb_vista_reporte.setVisible(true);
            this.vista.sel_vista_reporte.setVisible(true);
            this.vista.ver_reporte.setVisible(true);
            this.vista.lb_estatus.setVisible(true);
            this.vista.lb_convenio.setVisible(true);
            this.vista.prac_tab.setVisible(true);
            this.vista.total_table.setVisible(true);





            if(empresa.getFk_bancoId()==1){
                        this.vista.txt_cuenta.setMaximumLength(9);
                        long_cuenta=9;
                }
             if(empresa.getFk_bancoId()==2){
                        this.vista.txt_cuenta.setMaximumLength(10);
                         long_cuenta=10;
              }
             if(empresa.getFk_bancoId()==3){
                        this.vista.txt_cuenta.setMaximumLength(17);
                         long_cuenta=17;
              }
                

        } catch (Exception e) {
        }

    }
public void refreshTabla(){
        try {
            //con el periodo actual verifica si esta autorizado o no
            factura = query.isPeriodo_Autorizado(fecha.getCalendarioFacturacionPracticantesId());
            if(factura != null){// si no es nula ,esta autorizada
                this.vista.prac_tab.setVisible(true);
                this.iva = factura.getIva_factura();//obtiene el valor del iva con el que se facturo
                this.comision = factura.getComision();//obtiene el valor de la comision con el que se facturo
                factura_Detalle=query.getFactura_Detalle(factura.getPrefacturaId());//obtiene los registros cuando se autorizo
                this.vista.prac_tab.setLista_Pract_Autorizada(factura_Detalle);//los pinta en la tabla de practicantes
                this.vista.total_table.setLista_Totales(factura);// obtiene los totales y los pinta en la tabla totales
                this.vista.lb_convenio.setLabel_Txt("prefactura_convenios");
                this.vista.lb_estatus.setLabel_Txt("prefactura_estatus_ok");
                this.vista.lb_fechas.setLabel_Txt("prefactura_fecha_aut");
                this.vista.lb_usuario.setLabel_Txt("prefactura_usuario");
                
                this.vista.lb_convenio.setText(this.vista.lb_convenio.getText()+" "+factura_Detalle.size());//muestra la cantidad de registros
                this.vista.lb_fechas.setText(this.vista.lb_fechas.getText()+" "+formato.format(factura.getFecha_aut()));//muestra la fecha de autorizacion
                this.vista.lb_usuario.setText(this.vista.lb_usuario.getText()+" "+factura.getLogin());//usuario que autorizo
                tipo_proceso=1;
                permisos();

            }else{//si no esta autorizada
                this.iva = 16;//iva actual
                this.vista.prac_tab.setVisible(true);
                this.comision = empresa.getPorcentaje_comision();//comision para la empresa
                this.vista.lb_estatus.setLabel_Txt("prefactura_estatus_not_ok");//se muestra la etiqueta de prefactura no autorizada
                this.vista.lb_fechas.setLabel_Txt("prefactura_fecha_actual");//fecha actual
                this.vista.lb_fechas.setText(this.vista.lb_fechas.getText()+" "+formato.format(new Date()));
                this.vista.lb_convenio.setLabel_Txt("prefactura_convenios");
                Lista_Mayor=query.getFactura_Practicante(fecha);//obtiene los practicantes actuales para la prefactura
                if(Lista_Mayor != null && ! Lista_Mayor.isEmpty()){//si no es nula o  viene llena la lista
                    group_By_Practicante();//agrupa por practicante
                    this.vista.prac_tab.setLista_Practicante(Lista_Pantalla);//pinta los practicantes en la tabl
                    establecerMovimiento();
                    this.vista.total_table.setLista_Totales(getTotales(this.vista.prac_tab.getMonto_a_pagar(),this.vista.prac_tab.getSeguro_empresa(), _abono, _adeudo));
                    _abono=0.00;
                    _adeudo=0.00;
                    //obtiene los totales
                    this.vista.lb_convenio.setText(this.vista.lb_convenio.getText()+" "+Lista_Pantalla.size());
                    this.vista.prac_tab.getSelectionModel().clearSelection();
                    tipo_proceso=2;
                    permisos();
                }else{
                     this.vista.lb_convenio.setText(this.vista.lb_convenio.getText()+" 0");//no existen practicantes
                     this.vista.window_error.setVisible(true);
                     this.vista.add(this.vista.window_error);
                     this.vista.window_error.mensaje_Panel("prefactura_sin_practicante");
                     //error("prefactura_sin_practicante");
                     this.vista.prac_tab.getSelectionModel().clearSelection();//limpia la tabla de practicantes
                     this.vista.total_table.getSelectionModel().clearSelection();//limpia tabla totales
                     this.vista.prac_tab.setModel(new DefaultTableModel());
                     this.vista.total_table.setModel(new DefaultTableModel());
                     tipo_proceso=3;
                     permisos();
                     return;

                }
            }
        } catch (Exception e) {
            error("lb_error_cargapagina");
        }
    }
    public void establecerMovimiento(){
     AbonoQuery abc=new AbonoQuery();
     Double suma1, suma2;
     _adeudo=0.0;
     _abono=0.0;
     this.lista_mov=abc.getMovimiento(this.empresa.getEmpresaId(),this.fecha.getCalendarioFacturacionPracticantesId());
     for(int i=0;i<lista_mov.size();i++){
         MovimientosCaintra mc=(MovimientosCaintra)lista_mov.get(i);
         if(mc.getIsAbono()==0){
             suma1=mc.getCantidad();
             _adeudo+=suma1;
         }else{
             suma2=mc.getCantidad();
             _abono+=suma2;
         }
     }
     

    }
    public PrefacturaCaintra getTotales(double total_a_pagar,double seg_emp,double abono_empresa,double adeudo_empresa){
        PrefacturaCaintra f;
        double sub_total_sinseguro=0.0;
        double subtotal_c_seguro=0.0;
        double iva_1=0.0;
        double total_1=0.0;
        double subtotal_c_abonos=0.0;
        double iva_2=0.0;
        double total_final=0.0;
        double g_adm=0.0;
        f=new PrefacturaCaintra();
        double new_iva=0.0;double comision_f=this.comision;
        double new_comision=0.0;double iva_f=this.iva;
        try {

            f=new PrefacturaCaintra();
            new_comision= (comision_f/100);
            new_iva= (iva_f/100);
            g_adm=total_a_pagar * new_comision;
            sub_total_sinseguro=total_a_pagar + g_adm;
            //ya se tiene el seguro de empresa
            subtotal_c_seguro = sub_total_sinseguro + seg_emp + adeudo_empresa;
            iva_1 = (subtotal_c_seguro)* new_iva;
            total_1 = subtotal_c_seguro + iva_1;

            subtotal_c_abonos = (total_1 - abono_empresa)/(new_iva+1);
            iva_2 = (subtotal_c_abonos)*new_iva;
            total_final = total_1-abono_empresa;
            f.setSeguro_empresa(seg_emp);
            f.setMonto_a_pagar(total_a_pagar);
            f.setPorcentaje(empresa.getPorcentaje_comision());
            f.setGasto_adm(g_adm);

            f.setSubtotal_sin_seguro(sub_total_sinseguro);
            f.setAdeudos_empresa(adeudo_empresa);
            f.setSubtotal_conseguro(subtotal_c_seguro);
            f.setIva_1(iva_1);
            f.setTotal_1(total_1);
            f.setAbono_empresa(abono_empresa);
            f.setSubtotal_con_abono(subtotal_c_abonos);
            f.setIva_2(iva_2);
            f.setTotal_final(total_final);


        } catch (Exception e) {
            error("Fallo la Carga de los Totales");
        }
        return f;

    }
    public void imprimirJasper(int seleccion_reporte){
        try {
           iniciarReporte rep=new iniciarReporte();
           String par=""+this.fecha.getCalendarioFacturacionPracticantesId();
           if(factura == null){
                this.vista.total_table.getHeader().setIva_factura(iva);
                this.vista.total_table.getHeader().setRazon_Empresa(empresa.getRazon_empresa());
                this.vista.total_table.getHeader().setComision(comision);
                this.vista.total_table.getHeader().setRfc(empresa.getRfc());
                this.vista.total_table.getHeader().setRazon_social(empresa.getRazon_factura());
                this.vista.total_table.getHeader().setPeriodo(fecha.getDia_inicio(), fecha.getDia_fin());
                int res=query.insert_Total_Header(this.vista.total_table.getHeader(), fecha.getCalendarioFacturacionPracticantesId(), usuario, 1);
                query.insertTotales(this.vista.prac_tab.getDetalle_prefactura(), res);
                if(seleccion_reporte == 0){
                    rep.ejecutarReporte(par,seleccion_reporte,0);
                }else{
                    imprimir_excel(this.fecha.getCalendarioFacturacionPracticantesId());
                }
                
                query.deletePeriodoFactura(Integer.parseInt(par));
           }else{
                if(seleccion_reporte == 0){
                    rep.ejecutarReporte(par,seleccion_reporte,0);
                }else{
                    imprimir_excel(this.fecha.getCalendarioFacturacionPracticantesId());
                }
           } 
        } catch (Exception e) {
            error("Fallo Al Cargar El Reporte");
        }
    }
    public void imprimir_excel(int id){
        PrefacturaCaintra f_new=null;
        List<PrefacturaDetalle> f_detalle;
        DecimalFormat fd = new DecimalFormat("###########0.00");
        iniciarReporte rep=new iniciarReporte();
        try {
            f_new=query.isPeriodo_Autorizado(id);
            f_new.setPeriodo(fecha.getDia_inicio(), fecha.getDia_fin());
            f_detalle=query.getFactura_Detalle(f_new.getPrefacturaId());
            if(f_new == null)
                return;
            if(f_detalle == null || f_detalle.isEmpty())
                return;
            Writer w=new OutputStreamWriter(new FileOutputStream("C:/Users/develop/Documents/DocsSapra/factura_reporte.csv"), "UTF-8");
            //Writer w=new OutputStreamWriter(new FileOutputStream("/opt/innoapps/ALT/factura_reporte.csv"), "UTF-8");
            w.write("Empresa , "+f_new.getRazon_Empresa()+"\r\n");
            w.write("Razon Factura , "+f_new.getRazon_social()+"\r\n");
            w.write("Periodo , "+f_new.getPeriodo()+"\r\n");
            w.write("Usuario , "+f_new.getLogin()+"\r\n");
            w.write("#,CUENTA,NETO,NOMBRE PRACTICANTE,CENTRO COSTO,INICIO,TERMINO,CANCELACION,APORTACION MENSUAL,"
                    + "AJUSTES,DEDUCCION,SEGURO EMPRESA,SEGURO PRACTICANTE,DIAS,MONTO A PAGAR,G.ADM.,SUBTOTAL,IVA,TOTAL PRACTICANTE\r\n");

            PrefacturaDetalle dt;
            String linea="";

            double t_ajuste=0.0,t_deduccion=0.0,t_segemp=0.0,t_segprac=0.0,t_montopago=0.0;
            double t_gadm=0.0,t_subtotal=0.0,t_iva=0.0,t_total=0.0,t_neto=0.0;


            for (int i=0;i<f_detalle.size();i++){
                dt=(PrefacturaDetalle)f_detalle.get(i);
                linea+=""+(i+1)+",";
                linea += dt.getCuenta()+",";

                linea += "$ "+fd.format(dt.getNeto())+",";
                t_neto += dt.getNeto();

                linea += dt.getNombre()+" "+dt.getPaterno()+" "+dt.getMaterno()+",";
                linea += dt.getCentrocosto()+",";
                linea += dt.getFec_inicio()+",";
                linea += dt.getFec_termino()+",";
                linea += dt.getFec_baja()+",";
                linea += "$ "+fd.format(dt.getMonto_beca())+",";

                linea += "$ "+fd.format(dt.getAjuste())+",";
                t_ajuste += dt.getAjuste();
                
                linea += "$ "+fd.format(dt.getDeduccion())+",";
                t_deduccion += dt.getDeduccion();
                
                linea += "$ "+fd.format(dt.getSeg_emp())+",";
                t_segemp += dt.getSeg_emp();
                
                linea += "$ "+fd.format(dt.getSeg_pract())+",";
                t_segprac += dt.getSeg_pract();

                linea += dt.getDias_a_pagar()+",";
                
                linea += "$ "+fd.format(dt.getMonto_pagar())+",";
                t_montopago += dt.getMonto_pagar();

                double gadm=(dt.getMonto_pagar()/100) * f_new.getPorcentaje();
                t_gadm+=gadm;
                linea += "$ "+fd.format(gadm)+",";//gasto administrativo

                double subtot=dt.getMonto_pagar()+gadm+dt.getSeg_emp();
                t_subtotal += subtot;
                linea += "$ "+fd.format(subtot)+",";//subtotal

                double iva_p=(subtot/100) * f_new.getIva_factura();
                t_iva += iva_p;
                linea += "$ "+fd.format(iva_p)+",";

                double total = subtot + iva_p;
                t_total += total;
                linea += "$ "+fd.format(total)+"\r\n";
            }
            w.write(linea);
            linea=" , ,$ "+fd.format(t_neto)+", , , , , , ,"
                    + "$ "+fd.format(t_ajuste)+",$ "+fd.format(t_deduccion)+",$ "+fd.format(t_segemp)+","
                    + "$ "+fd.format(t_segprac)+", ,$ "+fd.format(t_montopago)+",$ "+fd.format(t_gadm)+""
                    + ",$ "+fd.format(t_subtotal)+",$ "+fd.format(t_iva)+",$ "+fd.format(t_total)+"\r\n\r\n";
            w.write(linea);
            linea ="CONCEPTO , MONTO \r\n";
            linea+="Monto a Pagar , $ "+fd.format(f_new.getMonto_a_pagar())+"\r\n";
            linea+=f_new.getPorcentaje()+" %  G. Adm. , $ "+fd.format(f_new.getGasto_adm())+"\r\n";
            linea+="Subtotal Sin Seguro , $ "+fd.format(f_new.getSubtotal_sin_seguro())+"\r\n";
            linea+="Seguro Empresa , $ "+fd.format(f_new.getSeguro_empresa())+"\r\n";
            linea+="Adeudos Empresa , $ "+fd.format(f_new.getAdeudos_empresa())+"\r\n";
            linea+="Subtotal Con Seguro , $ "+fd.format(f_new.getSubtotal_conseguro())+"\r\n";
            linea+="I.V.A , $ "+fd.format(f_new.getIva_1())+"\r\n";
            linea+="Total 1 , $ "+fd.format(f_new.getTotal_1())+"\r\n";
            linea+="Abono Empresa , $ "+fd.format(f_new.getAbono_empresa())+"\r\n";
            linea+="Subtotal Con Abonos , $ "+fd.format(f_new.getSubtotal_con_abono())+"\r\n";
            linea+="I.V.A. , $ "+fd.format(f_new.getIva_2())+"\r\n";
            linea+="Total Final , $ "+fd.format(f_new.getTotal_final())+"\r\n";
            w.write(linea);
            w.close();
            File f = new File("C:/Users/develop/Documents/DocsSapra/factura_reporte.csv");
            //File f = new File("/opt/innoapps/ALT/factura_reporte.csv");
            rep.descargarArchivo(f);
        } catch (Exception e) {
        }

    }
    public void guardar_Cuenta(){
        String num_cuenta="";
        long cuenta_lg=0;
        boolean res=true;
            try {
                if(! this.vista.prac_tab.getSelectionModel().isSelectionEmpty()){
                                num_cuenta=this.vista.txt_cuenta.getText().trim();
                                if(num_cuenta.equals("") ){
                                        error("prefactura_cuenta_sincuenta");
                                        return;
                                }
                                try {
                                    cuenta_lg=Long.parseLong(num_cuenta);
                                        if(cuenta_lg < 0){
                                            error("prefactura_cuenta_num");
                                            return;
                                        }
                                        if(cuenta_lg == 0){
                                            num_cuenta="";
                                        }
                                    } catch (Exception e) {
                                        error("prefactura_cuenta_num");
                                        return;
                                }
                                

                                seleccion_practicante=this.vista.prac_tab.getSelectionModel().getMinSelectedIndex();
                                p_sel=(Practicante)Lista_Pantalla.get(seleccion_practicante);
                                if(! num_cuenta.equals("")){
                                     if(num_cuenta.length() != long_cuenta){
                                        error("Longitud de cuenta debe ser de "+long_cuenta+" caracteres");
                                        return;
                                    }
                                    List<BanorteCuentas> resp = query.getCuenta(1, num_cuenta);
                                    BanorteCuentas bc;
                                    if(resp != null){
                                        if(! resp.isEmpty()){
                                            for(int i=0;i<resp.size();i++){
                                                bc=(BanorteCuentas)resp.get(i);
                                                if((p_sel.getNombre().toLowerCase().trim().equals(bc.getNombre().toLowerCase().trim()) &&
                                                        p_sel.getPaterno().toLowerCase().trim().equals(bc.getPaterno().toLowerCase().trim()) &&
                                                        p_sel.getMaterno().toLowerCase().trim().equals(bc.getMaterno().toLowerCase().trim())
                                                        || (formato.format(p_sel.getFec_nacimiento()).equals(formato.format(bc.getFec_nacimiento()))))){

                                                }else{
                                                        error("Ya existe una cuenta igual");
                                                        this.vista.txt_cuenta.setText("");
                                                        return;
                                                }
                                            }


                                        }
                                    }

                                }

                                Lista_Detalle=(ArrayList<Practicante>)Lista_Pract_Hm.get("pract_id_"+p_sel.getPracticanteId());
                                
                                res=query.actualizaCuenta(Lista_Detalle, num_cuenta,fecha.getCalendarioFacturacionPracticantesId());
                                this.vista.window_error.setVisible(true);
                                if(res)
                                    this.vista.window_error.mensaje_Panel("prefactura_cuenta_ok");
                                else
                                    this.vista.window_error.mensaje_Panel("prefactura_cuenta_ko");
                                this.vista.txt_cuenta.setText("");
                                refreshTabla();

                }else{
                    error("prefactura_select_usuario");
                }
            } catch (Exception e) {
            }
            
    }
    public void autorizar(){
        Calendar fecha_gap=Calendar.getInstance();
        Date dia_actual=new Date();
        try {
            
            
            fecha_gap.setTime(fecha.getDia_gap());
            fecha_gap.add(Calendar.DATE, 1);
            if(this.vista.prac_tab.getBandera_negativo() == 1){
                        error("prefactura_negativo");
                        return;
            }
            if(!usuario.getTipoUsuario().equals("A"))
                if(dia_actual.getTime() > fecha_gap.getTime().getTime()){
                            error("prefactura_gap");
                            return;
                }
            Practicante p_aux;
            for(int i=0;i<Lista_Mayor.size();i++){
                p_aux=(Practicante)Lista_Mayor.get(i);
                if(p_aux.getFec_cancelacion() != null)
                    continue;

                long offset = fecha.getDia_fin().getTime() - p_aux.getFec_terminoContrato().getTime();
                if(offset >= 0) {  // Si vence en este periodo y no es el ultimo dia
                    String msj="El practicante " + p_aux.getNombre() +" "+p_aux.getPaterno()+" "+p_aux.getMaterno()+
                    " vence en este periodo, por favor renueve su convenio o " +
                    "confirme la baja";
                    error(msj);
                    return;
                }

            }
            this.vista.total_table.getHeader().setIva_factura(iva);
            this.vista.total_table.getHeader().setRazon_Empresa(empresa.getRazon_empresa());
            this.vista.total_table.getHeader().setComision(comision);
            this.vista.total_table.getHeader().setRfc(empresa.getRfc());
            this.vista.total_table.getHeader().setRazon_social(empresa.getRazon_factura());
            this.vista.total_table.getHeader().setPeriodo(fecha.getDia_inicio(), fecha.getDia_fin());
            int res=query.insert_Total_Header(this.vista.total_table.getHeader(), fecha.getCalendarioFacturacionPracticantesId(), usuario, 1);
            if(res != -1){
                int res2=query.insertTotales(this.vista.prac_tab.getDetalle_prefactura(), res);

                if(res2 == -1){
                        query.deleteFactura(res);
                        error("prefactura_negativo");
                        return;
                }else{
                    this.vista.window_error.setVisible(true);
                    this.vista.window_error.mensaje_Panel("prefactura_ok");
                    query.updatePoliza(1, fecha.getCalendarioFacturacionPracticantesId());
                    email.envioFactura_Caintra(fecha, true,null);
                    refreshTabla();
                }
                
            }else{
                     error("prefactura_error_guardado");
                     return;
            }
        } catch (Exception e) {
                     error("prefactura_error_guardado");
        }
    }
    public void cancelar(){
        try {
            email.envioFactura_Caintra(fecha, false,usuario);
            query.deleteFactura(factura.getPrefacturaId());
            this.vista.window_error.setVisible(true);
            this.vista.window_error.mensaje_Panel("prefactura_cancel");
            query.updatePoliza(0, fecha.getCalendarioFacturacionPracticantesId());
            refreshTabla();
        } catch (Exception e) {
            error("Error Al Cancelar Prefactura");
        }
    }
    public void periodo_actual(){
        Calendariofacturacionpracticantes periodo;
        Date dia_actual=new Date();
        String fecha_str="";
        int bandera=-1;
        try {
            fecha_str=formato.format(dia_actual);//obtiene la fecha actual y la convierte a String
            dia_actual = formato.parse(fecha_str);//setea la nueva fecha con standard de 00:00:00  hh mm ss

            for(int i=0;i < lista_periodo.size();i++){
                    periodo = (Calendariofacturacionpracticantes)lista_periodo.get(i);
                    if(dia_actual.getTime()<periodo.getDia_pago().getTime()){//si el dia actual es menor al dia de pago
                        this.vista.sel_periodos.setSelectedItem(periodo);//se selecciona el periodo en el selectField de periodos
                        fecha = periodo;//obtenemos el Periodo a nivel global de la clase
                        if((i+1)<lista_periodo.size()){
                            fecha_siguiente=(Calendariofacturacionpracticantes)lista_periodo.get(i+1);
                        }else{
                            fecha_siguiente = null;
                        }
                        refreshTabla();// se va a obtener los registros para ese periodo
                        bandera = 1;
                        break;
                    }
            }
            if(bandera == -1){
                error("lb_error_periodo");
            }
        } catch (Exception e) {
                error("lb_error_cargapagina");
        }
    }
    public void Action_selectEmpresa(){

        try {
                lista_periodo=query.getPeriodos(empresa.getEmpresaId());//obtiene todos los periodos correspondientes
                if(lista_periodo != null || ! lista_periodo.isEmpty()){
                        this.vista.sel_periodos.Modelo_Periodo(lista_periodo);// se agregan los periodos al componente selectField
                        periodo_actual();//manda llamar al metodo para buscar el periodo actual
                }else{
                    error("lb_error_periodo");
                    return;
                }

            
        } catch (Exception e) {
                error("lb_error_cargapagina");
                return;
        }

    }
    public void Action_selectPeriodo(){
        try {
             fecha = (Calendariofacturacionpracticantes)this.vista.sel_periodos.getSelectedItem();
             refreshTabla();
        } catch (Exception e) {
            error("Error al seleccionar periodo");
        }

    }
    public void Action_selectTable(){
        try {
            if(! this.vista.prac_tab.getSelectionModel().isSelectionEmpty()){
                        if(tipo_proceso == Autorizada){
                              p_sel=(Practicante)Lista_Pantalla.get(seleccion_practicante);
                              this.vista.window_decision.setContentPane(new DecisionPane(this));
                        }
                        if(tipo_proceso == No_Autorizada){
                                seleccion_practicante=this.vista.prac_tab.getSelectionModel().getMinSelectedIndex();
                                p_sel=(Practicante)Lista_Pantalla.get(seleccion_practicante);
                                Lista_Detalle=(ArrayList<Practicante>)Lista_Pract_Hm.get("pract_id_"+p_sel.getPracticanteId());
                                //this.vista.window_decision.setWidth(new Extent(550));
                                this.vista.window_decision.setContentPane(new DecisionPane(this));
                        }


                                
                                

            }else{
                error("prefactura_select_usuario");
            }
        } catch (Exception e) {
            error("Error al seleccionar tabla");
        }
    }

    public void Action_seguro(){
        try {
             if(! this.vista.prac_tab.getSelectionModel().isSelectionEmpty()){
                     try {
                             int index = vista.prac_tab.getSelectionModel().getMinSelectedIndex();
                             boolean res1;
                             Practicante p=new Practicante();

                            if(index >= 0){
                                 p = (Practicante)Lista_Pantalla.get(index);
                            }else {
                                 return;
                            }
                             if(p.getSeguroEmpresa() > 0|| p.getSeguroPracticante() !=0){
                                 int res=dPracticante.UpdateSeguro(p.getPracticanteId(), true, this.fecha.getCalendarioFacturacionPracticantesId());
                                 if(res >= 0)
                                     error("Seguro Eliminado correctamente");
                                 else
                                    error("Error en cobro de seguro");
                             }else{
                                 int res=dPracticante.UpdateSeguro(p.getPracticanteId(), false, this.fecha.getCalendarioFacturacionPracticantesId());
                                 if(res >= 0)
                                     error("Seguro agregado correctamente");
                                 else
                                    error("Error en la eliminacion de seguro");

                             }
                             } catch (Exception exc) {
                             }finally{
                                            seleccion_practicante=-1;
                                            this.vista.prac_tab.getSelectionModel().clearSelection();
                            }
             }else{
                error("prefactura_select_usuario");
             }

        } catch (Exception e) {
        }finally{
            refreshTabla();
        }
    }
    public void group_By_Practicante(){
        Lista_Pract_Hm=new HashMap();
        String param_id="pract_id_";
        int longitud=0;

        Practicante p1,p2;
        int dias=0;

        try {
            Lista_Pantalla=new ArrayList<Practicante>();
            Lista_Detalle=new ArrayList<Practicante>();
            longitud=Lista_Mayor.size();
            if(!(longitud <= 0)){
                if(longitud == 1){
                    p1=(Practicante)Lista_Mayor.get(0);
                    //dias=dias_a_pagar(p1, fecha);
                    p1.obtener_fechas();
                    p1.setLista_dias(eliminaDia31(p1.getLista_dias()));
                    p1.setDias(p1.getLista_dias().size()+ultimoDiaMes(p1.getLista_dias()), fecha.getDias_a_pagar_periodo());
                    Lista_Pantalla.add(p1);
                    Lista_Detalle.add(p1);
                    Lista_Pract_Hm.put(param_id+""+p1.getPracticanteId(), Lista_Detalle);
                    //Lista_Mayor.remove(p1);
                }else{
                        int i=0;
                        int j=0;
                        Practicante p_pantalla;
                        for(i=0;i<longitud;i++){
                                double aux_SeguroEmpresa=0;
                                double aux_SeguroPracticante=0;
                                double aux_AjusteMonto=0;
                                double aux_DeduccionMonto=0;
                                int aux_AjusteDia=0;
                                int aux_DeduccionDia=0;


                                p1=(Practicante)Lista_Mayor.get(i);
                                Lista_Detalle=new ArrayList<Practicante>();
                                p1.setDias(p1.obtener_fechas().size()+ultimoDiaMes(p1.getLista_dias()), fecha.getDias_a_pagar_periodo());
                                

                                aux_SeguroEmpresa=p1.getSeguroEmpresa();//setea la cantidad de seguro empresa
                                aux_SeguroPracticante=p1.getSeguroPracticante();//setea la cantidad de seguro empresa
                                aux_AjusteMonto=p1.getAjustemonto();//setea la cantidad de seguro empresa
                                aux_DeduccionMonto=p1.getDeduccionmonto();//setea la cantidad de seguro empresa
                                aux_AjusteDia=p1.getAjustedia();//setea la cantidad de seguro empresa
                                aux_DeduccionDia=p1.getDeducciondia();//setea la cantidad de seguro empresa

                                p_pantalla=new Practicante();
                                p_pantalla.setPracticanteId(p1.getPracticanteId());
                                p_pantalla.setNombre(p1.getNombre());
                                p_pantalla.setPaterno(p1.getPaterno());
                                p_pantalla.setMaterno(p1.getMaterno());
                                p_pantalla.setCentrocosto(p1.getCentrocosto());
                                p_pantalla.setFec_inicioContrato(p1.getFec_inicioContrato());
                                p_pantalla.setFec_terminoContrato(p1.getFec_terminoContrato());
                                p_pantalla.setFec_cancelacion(p1.getFec_cancelacion());
                                p_pantalla.setSueldo(p1.getSueldo());
                                p_pantalla.setLista_dias(p1.obtener_fechas());
                                p_pantalla.setCuenta(p1.getCuenta());
                                p_pantalla.setLista_dias(eliminaDia31(p_pantalla.getLista_dias()));
                                p_pantalla.setFec_nacimiento(p1.getFec_nacimiento());
                                p_pantalla.setDepartamento(p1.getDepartamento());
                                p_pantalla.setFec_cancelacion(p1.getFec_cancelacion());
                                Lista_Detalle.add(p1);
                                for(j=i+1;j<longitud;j++){
                                        p2=(Practicante)Lista_Mayor.get(j);
                                        

                                        if(p_pantalla.getNombre().equals(p2.getNombre())
                                                && p_pantalla.getPaterno().equals(p2.getPaterno())
                                                && p_pantalla.getMaterno().equals(p2.getMaterno())){
                                                
                                                Lista_Detalle.add(p2);
                                                /*
                                                if(p_pantalla.getFec_inicioContrato().getTime() > p2.getFec_inicioContrato().getTime()){
                                                      p_pantalla.setFec_inicioContrato(p2.getFec_inicioContrato());
                                                }
                                                if(p_pantalla.getFec_terminoContrato().getTime() < p2.getFec_terminoContrato().getTime()){
                                                      p_pantalla.setFec_terminoContrato(p2.getFec_terminoContrato());
                                                }*/
                                                if(p2.getPracticanteId()>p_pantalla.getPracticanteId()){
                                                    p_pantalla.setFec_inicioContrato(p2.getFec_inicioContrato());
                                                    p_pantalla.setFec_terminoContrato(p2.getFec_terminoContrato());
                                                    //aux_SeguroEmpresa=p2.getSeguroEmpresa();
                                                    //aux_SeguroPracticante=p2.getSeguroPracticante();
                                                    p_pantalla.setSueldo(p2.getSueldo());
                                                }else{

                                                }
                                                aux_SeguroEmpresa += p2.getSeguroEmpresa();
                                                aux_SeguroPracticante += p2.getSeguroPracticante();
                                                aux_AjusteMonto += p2.getAjustemonto();
                                                aux_DeduccionMonto += p2.getDeduccionmonto();
                                                aux_AjusteDia += p2.getAjustedia();
                                                aux_DeduccionDia += p2.getDeducciondia();
                                                p_pantalla.setDepartamento(p2.getDepartamento());
                                                p2.obtener_fechas();
                                                p2.setLista_dias(eliminaDia31(p2.getLista_dias()));
                                                p2.setDias(p2.getLista_dias().size()+ultimoDiaMes(p2.getLista_dias()), fecha.getDias_a_pagar_periodo());
                                                
                                                p_pantalla.setLista_dias(compara_fecha(p_pantalla.getLista_dias(), p2.obtener_fechas()));

                                                if(p_pantalla.getFec_cancelacion() != null){
                                                    if(p2.getFec_cancelacion() == null){
                                                            p_pantalla.setFec_cancelacion(null);
                                                    }else{
                                                        if(p2.getFec_cancelacion().getTime()>p_pantalla.getFec_cancelacion().getTime()){
                                                             p_pantalla.setFec_cancelacion(p2.getFec_cancelacion());
                                                        }

                                                    }
                                                }


                                        }else{
                                                break;
                                        }

                                }

                                p_pantalla.setSeguroEmpresa(aux_SeguroEmpresa);
                                p_pantalla.setSeguroPracticante(aux_SeguroPracticante);
                                p_pantalla.setAjustemonto(aux_AjusteMonto);
                                p_pantalla.setDeduccionmonto(aux_DeduccionMonto);
                                p_pantalla.setAjustedia(aux_AjusteDia);
                                p_pantalla.setDeducciondia(aux_DeduccionDia);

                                p_pantalla.getLista_dias().size();
                                p_pantalla.setDias(p_pantalla.getLista_dias().size()+ultimoDiaMes(p_pantalla.getLista_dias()), fecha.getDias_a_pagar_periodo());





                                Lista_Pract_Hm.put(param_id+""+p1.getPracticanteId(), Lista_Detalle);
                                i=j-1;
                                Lista_Pantalla.add(p_pantalla);

                        }
                    }
            }

            
        } catch (Exception e) {
            error("Error al agrupar los practicantes");
        }

    }
    public int ultimoDiaMes(ArrayList<String> lista_fecha){
        String fecha_mes="";
        String fecha_lista="";
        int dia_ultimo=0;
        int suma_dia=0;
        try {
           Calendar c=Calendar.getInstance();
           Calendar otro=Calendar.getInstance();
           otro.setTime(fecha.getDia_fin());
           
           if(fecha.getDias_a_pagar_periodo() != 14){
                c.setTime(fecha.getDia_fin());
                if(Calendar.FEBRUARY == c.get(Calendar.MONTH)){
                        dia_ultimo=c.getActualMaximum(Calendar.DAY_OF_MONTH);//obtiene el ultimo dia del mes de la fecha final de prefactura
                        otro.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));//ultimo dia de mes 
                        fecha_mes=formato.format(otro.getTime());//obtiene String de Fecha fin de mes
                        
                        
                        for(int i=0;i<lista_fecha.size();i++){
                            fecha_lista=(String)lista_fecha.get(i);
                            if(fecha_lista.equals(fecha_mes)){
                                if(dia_ultimo == 29) suma_dia=1;
                                if(dia_ultimo == 28) suma_dia=2;
                                break;
                            }
                        }
                        
                }
           }



       } catch (Exception e) {
            return 0;
       }
        return suma_dia;
   }

    public ArrayList<String> eliminaDia31(ArrayList<String> lista){// solo para las que no son catorcenales
        String fecha_aux;
        String[] destajo_fecha;
        try {
             for(int i=0;i<lista.size();i++){
                  fecha_aux = (String)lista.get(i);
                  destajo_fecha=fecha_aux.split("-");
                  if((fecha.getDias_a_pagar_periodo() != 14) && destajo_fecha[2].equals("31")){
                        lista.remove(i);
                        i--;
                  }
             }
        } catch (Exception e) {
            return null;
        }
        return lista;

    }
    public ArrayList<String> compara_fecha(ArrayList<String> lista_p1,ArrayList<String> lista_p2){
       String fecha_1;
       String fecha_2;
       String[] destajo_fecha;
       

       try {
           for(int i=0;i<lista_p1.size();i++){
                fecha_1 = (String)lista_p1.get(i);
                destajo_fecha=fecha_1.split("-");

                if((fecha.getDias_a_pagar_periodo() != 14) && destajo_fecha[2].equals("31")){
                        lista_p1.remove(i);
                        i--;
                }else{
                        for(int j=0;j < lista_p2.size();j++){
                            fecha_2 = (String)lista_p2.get(j);
                            destajo_fecha=fecha_2.split("-");
                            
                            if(fecha_1.equals(fecha_2)){
                                        lista_p2.remove(j);
                                        j--;
                             }
                            



                        }
                }

                

           }
        lista_p1.addAll(lista_p2);


       } catch (Exception e) {
           return null;
       }
       return lista_p1;
   }

    public void abono_adeudo(){
        try {
            this.vista.window_abono.setVisible(true);
            this.vista.window_abono.setModal(true);
            this.vista.window_abono.setTitle("Movimientos de empresa");
            this.vista.window_abono.setClosable(false);

            //this.vista.window_abono.setHeight(new Extent(350));
            this.vista.window_abono.setContentPane(new AbonoView(this));
        } catch (Exception e) {
            error("lb_error_cargapagina");
        }

    }

     public void actionPerformed(ActionEvent e) {
         try {
            if(e.getActionCommand().equals("selectTable")){
                try {
                    if(tipo_usuario != Administrador){
                        return;
                    }
                        if(! this.vista.prac_tab.getSelectionModel().isSelectionEmpty()){
                            try {
                                seleccion_practicante=this.vista.prac_tab.getSelectionModel().getMinSelectedIndex();
                                p_sel=(Practicante)Lista_Pantalla.get(seleccion_practicante);
                                Lista_Detalle=(ArrayList<Practicante>)Lista_Pract_Hm.get("pract_id_"+p_sel.getPracticanteId());
                                if(Lista_Detalle == null || Lista_Detalle.isEmpty()){
                                    this.vista.b_seguro.setVisible(false);
                                    return;
                                }


                                if(Lista_Detalle.size()>1){
                                    this.vista.b_seguro.setVisible(false);
                                }else{
                                    this.vista.b_seguro.setVisible(true);
                                }
                            } catch (Exception ex) {
                            }

                        }else{

                        }
                    } catch (Exception exc) {
                        error("lb_error_cargapagina");
                        return;
                    }
            }
            if(e.getActionCommand().equals("sel_empresa")){
                        Action_selectEmpresa();
            }
            if(e.getActionCommand().equals("sel_periodo")){
                    Action_selectPeriodo();
            }
            if(e.getActionCommand().equals("autorizar")){
                    autorizar();
            }
            if(e.getActionCommand().equals("cancelar")){
                   cancelar();
            }
            if(e.getActionCommand().equals("v_reporte")){
                int seleccion_reporte=-1;
                if(this.vista.sel_vista_reporte.getSelectionModel().isSelectionEmpty()){
                     error("Favor de Seleccionar el tipo de reporte deseado");
                     return;
                }else{
                    seleccion_reporte=this.vista.sel_vista_reporte.getSelectedIndex();
                    imprimirJasper(seleccion_reporte);
                }


            }
           
            if(e.getActionCommand().equals("update_pref")){
                refreshTabla();
            }
            if(e.getActionCommand().equals("ok_cuenta")){//movimiento
                guardar_Cuenta();
            }
            if(e.getActionCommand().equals("movimiento")){
                try {
                        Action_selectTable();
                    } catch (Exception exc) {
                        error("lb_error_cargapagina");
                        return;
                    }
            }
            if(e.getActionCommand().equals("abono_adeudo")){//movimiento
                    abono_adeudo();
            }

            if(e.getActionCommand().equals("seguro")){Action_seguro();}
        } catch (Exception exc) {
                error("lb_error_cargapagina");
                return;
        }
    }



}
